//
//  FileController.swift
//  hello
//
//  Created by 赵康 on 2024/10/19.
//

import Foundation
import Vapor
import Fluent

struct FileController: RouteCollection {
	func boot(routes: any RoutesBuilder) throws {
		let files = routes.grouped("files")
		files.post("upload", use: self.upload)
	}
	
		/// 文件上传到服务器
		/// - Parameter req: HTTP 请求
		/// - Returns: 构造了一个 HTTP 响应对象, 包含了文件的 URL;
		/// 1. **HTTP 状态码**:
		/// 这个方法没有显式地设置状态码，默认情况下，当文件成功流式传输时，服务器将返回 HTTP 200 状态码，表示请求成功。
		///	2. **HTTP 响应体**: 服务器将文件流式传输给客户端，客户端将文件保存到本地。
		///	3. **HTTP 响应头**: 服务器将设置 Content-Type 和 Content-Length 头，以便客户端正确解析文件。
	@Sendable
	func upload(req: Request) async throws -> Response {
		let file = try req.content.decode(File.self)
			/// 保存文件到 Public/Articles 目录
		let path = req.application.directory.publicDirectory + "/Articles/" + file.filename
		try await req.fileio.writeFile(.init(data: file.data), at: path)
			/// 构造文件的
		let fileURL = "https://bayanarabic.cn/Articles/\(file.filename)"
			
			///文件保存后生成了一个响应数据, 它就是一个 JSON 对象, 包含了文件的 URL;
		let jsonResponse = ["url": fileURL]
		return try Response(status: .created, headers: ["Content-Type": "application/json"], body: .init(data: JSONEncoder().encode(jsonResponse)))
	}
	
		/// 下载文件
		/// - Parameter req:  HTTP 请求
		/// - Returns:
		
	@Sendable
	func download(req: Request) async throws -> Response {
		guard
			let filename = req.parameters.get("反向代理.pdf")
		else {
			throw Abort(.badRequest)
		}
		let filePath = req.application.directory.publicDirectory + "/Articles/" + filename
		
		guard
			FileManager.default.fileExists(atPath: filePath)
		else {
			throw Abort(.notFound)
		}
		return req.fileio.streamFile(at: filePath)
	}
}
	

